// 导入http 模块
import http from 'wechat-http'

// 配置基准路径
http.baseURL = 'https://live-api.itheima.net'

//配置请求拦截器携带token
// 请求拦截器会在每次发请求都会触发
http.intercept.request = (params) => {
  // console.log('请求拦截器触发')
  // console.log('params  ----->  ', params)
  // params: {
  //   url: 'xxxx',
  //   header: {
  //   Authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZC…gzNH0.83KwrDc8O17n7L-jFHIqoiuY84vOIL_1VxPLzMduMkk'
  // }
  // }

  const app = getApp() //获取应用实例
  // console.log(app)
  // 给请求头加上token
  // 先判断是否有token
  if (app.token) {
    // 通过对象.属性名 = 值给对象添加属性和属性值
    // 不能直接赋值,如果有其他数据就会被覆盖
    // params.header = { Authorization: `Bearer ${app.token}` }
    params.header = {
      // 我们需要在这里换位置,让后面的代码覆盖前面的，这样就不会出现刷新token的时候携带的refreshToken改为token了
      Authorization: `Bearer ${app.token}`,
      ...params.header, //需要展开原来的header里面的数据加上传进去的
    }
  }
  // console.log(params)
  return params
}

// 配置响应拦截器简化返回结果
http.intercept.response = async (res) => {
  // 判断状态码是否为401，如果为401即为token失效
  if (res.data.code === 401) {
    //处理refreshtoken失效
    if (res.config.url.includes('/refreshToken')) {
      // 获取页面信息
      const pages = getCurrentPages()
      // 获取到当前页
      const lastpage = pages[pages.length - 1]
      // 获取到当前页路径
      const redirect = lastpage.route
      // console.log('redirect  ----->  ', redirect)
      // 跳转到登录页面
      return wx.redirectTo({
        // 把当前页传递给登录页,方便登录成功后回到来源页
        url: '/pages/login/index?redirect=' + redirect,
      })
    }
    //获取应用实例
    const app = getApp()
    // console.log('app  ----->  ', app)
    console.log('app.refreshToken  ----->  ', app.refreshToken)
    //重新发送请求获取最新的token和refreshtoken
    const result = await http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        Authorization: `Bearer ${app.refreshToken}`,
      },
    })
    // 这里会有个Bug,会重新路过请求拦截器会把refreshToken换成token
    console.log('响应错误重新请求结果  ----->  ', result)
    // 把最新的refreshToken和token解构出来
    const { token, refreshToken } = result.data
    // 存储到应用实例中
    app.setToken(token, refreshToken)
    // console.log('res  ----->  ', res)

    //重新发一次之前错误的请求
    // res.config包含了请求的路径和参数和方式那些
    // console.log('res.config  ----->  ', res.config)
    return await http({
      // 由于之前的错误请求请求头的token是错误的,所以我们需要带上最新的token
      // 展开原来的放到对象中
      ...res.config,
      // 重新设置请求头
      header: {
        Authorization: `Bearer ${token}`,
      },
    })
  }
  // 过滤接口返回的数据
  return res.data
}

//挂载到全局
wx.http = http

//模块导出
export default http
